package nige.jar.classe;

import nige.utils.object.Attente;

/**
 * Classe principale qui permet de lancer le scan des classes
 * <br />- LOG : Log principale de la classe
 * <br />- dossier : Dossier a scanner (contenant tous les .java - .class et .jar)
 * <br />- classe : Classe a trouver
 * <br />- jf : resultat de l analyse
 * @author Nicolas Genevaux
 * 
 * DEPTH  2
 *       Object
 *       Thread
 * CALLEE  6
 *       CreateFenetre
 *       Fenetre
 *       FenetreAction
 *       FenetreGen
 *       JarFound
 *       ListeFichier
 *       Principale
 * 
 * 14-02-2008   Nicolas Genevaux      v.0.0.1
 */
public class Principale extends Thread {
  
  /**
   * LOG : Log principale de la classe
   */
  private String log = "";
  /**
   * dossier : Dossier a scanner (contenant tous les .java - .class et .jar)
   */
  private String dossier = "";
  /**
   * classe : Classe a trouver
   */
  private String classe = "";
  /**
   * jf : resultat de l analyse
   */
  private JarFound jf = new JarFound();
  /**
   * Permet de connaitre letat du thread
   */
  private boolean isAlive = true;
  
  /**
   * Constructeur de la classe
   * @param odossier Dossier a scanner
   * @param oclasse Classe a trouver
   * @param ojf Objet contenant le resultat de l analyse
   */
  public Principale(String odossier,String oclasse,JarFound ojf) {
    dossier = odossier;
    classe = oclasse;
    jf = ojf;
  }
  
  /**
   * Permet de lancer le thread de la classe
   * Lance un thread ListeFichier
   * Test si le nombre de fichier a evolue, critere pour l arret du scan
   * realise la boucle a faire (loopPerform)
   */
  public void run() {
    isAlive = true;
    log = "Initialisation...";
    ListeFichierJar lfj = new ListeFichierJar(dossier,classe,jf);
    lfj.start();
    Attente.perform(1000);
    int lastNumber = -1;
    int lastNumber2 = -1;
    int egal = 0;
    while(
        (lastNumber!=jf.getFichierTotal() || 
        lastNumber2!=jf.getClasseTotal() ||
        egal<5) && isAlive
        ) {
      if(lastNumber==jf.getFichierTotal() && lastNumber2==jf.getClasseTotal()) {
        egal++;
      }
      else {
        egal = 0;
      }
      lastNumber = jf.getFichierTotal();
      lastNumber2 = jf.getClasseTotal();
      Attente.perform(1000);
      loopPerform();
    }
  }

  /**
   * Concatenation de la chaine de caractere pour obtenir le bon log
   */
  private void loopPerform() {
    log = "Jars : "+jf.getAllJars().size();
    log += " - Dossiers : "+jf.getFichierTotal();
    log += " - Thread : "+ 
    ((jf.getThreadEnded()+jf.getThreadLaunch())>0? jf.getThreadEnded()+jf.getThreadLaunch() : 0);
  }
  
  /**
   * Getter du LOG
   * @return ...  Le LOG
   */
  public String getLOG() {
    return log;
  }

  /**
   * Provoque l interruption du thread
   * lors de la pression du bouton stop
   */
  public void arret() {
    isAlive = false;
  }
}
